package ar.com.raulsanchez.syncrolist;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class BDActividades {
	public static final String ID 	   			 	= "_id";
	public static final String ACTIVIDAD_ID 	 	= "actividad_id";
    public static final String ACTIVIDAD_TITULO  	= "titulo";
    public static final String ACTIVIDAD_DETALLE 	= "detalle";
    public static final String ACTIVIDAD_FECHA   	= "fecha";
    public static final String ACTIVIDAD_USUARIO_ID = "usuario_id";
    public static final String ACTIVIDAD_VERSION    = "version";
    
    private static final String BD_NOMBRE 	 	 = "syncrolist.db";
    private static final String TABLA_NOMBRE 	 = "actividades";
    private static final String TAG 			 = "BDActividades";
    private static final int	DATABASE_VERSION = 5;
    
    private static final String DATABASE_CREATE =
        "CREATE TABLE " + TABLA_NOMBRE + " (" 
        	+ ID      + " integer primary key autoincrement, "
            + ACTIVIDAD_ID  + " integer not null, " 
        	+ ACTIVIDAD_TITULO  + " text not null, " 
            + ACTIVIDAD_DETALLE + " text not null, "    
            + ACTIVIDAD_FECHA + " text not null, "
        	+ ACTIVIDAD_USUARIO_ID + " integer not null, "
            + ACTIVIDAD_VERSION + " integer not null" +
        ");";
    
    
    private final Context mCtx;
    
    private DatabaseHelper mDbHelper;
    private SQLiteDatabase mDb;

    private static class DatabaseHelper extends SQLiteOpenHelper {

        DatabaseHelper(Context context) {
            super(context, BD_NOMBRE, null, DATABASE_VERSION);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {

            db.execSQL(DATABASE_CREATE);
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
                    + newVersion + ", which will destroy all old data");
            db.execSQL("DROP TABLE IF EXISTS " + TABLA_NOMBRE);
            onCreate(db);
        }
    }

    /**
     * Constructor - takes the context to allow the database to be
     * opened/created
     * 
     * @param ctx the Context within which to work
     */
    public BDActividades(Context ctx) {
        this.mCtx = ctx;
    }

    /**
     * Open the activities database. If it cannot be opened, try to create a new
     * instance of the database. If it cannot be created, throw an exception to
     * signal the failure
     * 
     * @return this (self reference, allowing this to be chained in an
     *         initialization call)
     * @throws SQLException if the database could be neither opened or created
     */
    public BDActividades open() throws SQLException {
        mDbHelper = new DatabaseHelper(mCtx);
        mDb = mDbHelper.getWritableDatabase();
        return this;
    }

    public void close() {
        mDbHelper.close();
    }

    public long addActivity(int usuario_id, String titulo, String detalle, String fecha) {
        ContentValues initialValues = new ContentValues();
        
        int version = (int)(System.currentTimeMillis()/1000);
        
        initialValues.put(ACTIVIDAD_TITULO, titulo);
        initialValues.put(ACTIVIDAD_DETALLE, detalle);
        initialValues.put(ACTIVIDAD_FECHA, fecha);
        initialValues.put(ACTIVIDAD_USUARIO_ID, usuario_id);
        initialValues.put(ACTIVIDAD_ID, 0);
        initialValues.put(ACTIVIDAD_VERSION, version);
        
        long result = mDb.insert(TABLA_NOMBRE, null, initialValues);
        /* MUST PROPAGATE OUTSIDE UI !
        if (result != -1) {
            WebServiceInterface ws = new WebServiceInterface();
            int actividad_id = ws.addActivity(usuario_id, titulo, detalle, fecha, version);
            if (actividad_id != 0)
            	setActivityId(result, actividad_id);
        }*/ 
        return result;
    } // addActivity (to both, client and server)

    
    public long addActivity(int actividad_id, String titulo, String detalle, String fecha, int usuario_id, int version) {
        ContentValues initialValues = new ContentValues();
        
        initialValues.put(ACTIVIDAD_ID, actividad_id);
        initialValues.put(ACTIVIDAD_TITULO, titulo);
        initialValues.put(ACTIVIDAD_DETALLE, detalle);
        initialValues.put(ACTIVIDAD_FECHA, fecha);
        initialValues.put(ACTIVIDAD_USUARIO_ID, usuario_id);
        initialValues.put(ACTIVIDAD_VERSION, version);
              
        return mDb.insert(TABLA_NOMBRE, null, initialValues);
    } // addActivity (to client)
    
    public boolean delActivity(long id, boolean propagate) {
    	Cursor c = getActivity(id);
    	int actividad_id = c.getInt(c.getColumnIndex(ACTIVIDAD_ID));
    	boolean result = mDb.delete(TABLA_NOMBRE, ID + "=" + id, null) > 0;
		
        if (result && propagate) {
            WebServiceInterface ws = new WebServiceInterface();
            ws.delActivity(actividad_id);
        }
        
        return result;
    } // delActivity
    
    public Cursor getActivities(int usuario_id) {
        return mDb.query(TABLA_NOMBRE, 
        				 new String[] {ID, ACTIVIDAD_ID, ACTIVIDAD_TITULO, ACTIVIDAD_DETALLE, ACTIVIDAD_FECHA, ACTIVIDAD_VERSION},
        				 ACTIVIDAD_USUARIO_ID + "=" + usuario_id, null, null, null, null);
    } // getActivities

    public Cursor getActivity(int usuario_id, int actividad_id) {
        return mDb.query(TABLA_NOMBRE, 
        				 new String[] {ID, ACTIVIDAD_ID, ACTIVIDAD_TITULO, ACTIVIDAD_DETALLE, ACTIVIDAD_FECHA, ACTIVIDAD_USUARIO_ID, ACTIVIDAD_VERSION}, 
        				 ACTIVIDAD_USUARIO_ID + "=" + usuario_id + " AND " + ACTIVIDAD_ID + "=" + actividad_id,
        				 null, null, null, null);
    } // getActivity (by user_id and activity_id)
    
    
    public Cursor getActivity(long id) throws SQLException {
        Cursor mCursor =
            mDb.query(true, TABLA_NOMBRE, 
            		  new String[] {ID, ACTIVIDAD_ID, ACTIVIDAD_TITULO, ACTIVIDAD_DETALLE, ACTIVIDAD_FECHA, ACTIVIDAD_USUARIO_ID, ACTIVIDAD_VERSION},
            		  ID + "=" + id, null, null, null, null, null);
        if (mCursor != null) {
            mCursor.moveToFirst();
        }
        return mCursor;
    } // getActivity (by postion)
    
    public Cursor getActivityPerId(int actividad_id) throws SQLException {
        Cursor mCursor =	
            mDb.query(true, TABLA_NOMBRE, 
            		new String[] {ID, ACTIVIDAD_ID, ACTIVIDAD_TITULO, ACTIVIDAD_DETALLE, ACTIVIDAD_FECHA, ACTIVIDAD_USUARIO_ID, ACTIVIDAD_VERSION}, 
            		ACTIVIDAD_ID + "=" + actividad_id, null, null, null, null, null);
        
        if (mCursor != null) {
            mCursor.moveToFirst();
        }
        return mCursor;
    } // getActivityPerId

    public boolean updActivity(long id, int actividad_id, String titulo, String detalle, String fecha) {
        ContentValues args = new ContentValues();

        int version = (int)(System.currentTimeMillis()/1000);
        
        args.put(ACTIVIDAD_TITULO, titulo);
        args.put(ACTIVIDAD_DETALLE, detalle);
        args.put(ACTIVIDAD_FECHA, fecha);
        args.put(ACTIVIDAD_VERSION, version);
        
        int result = mDb.update(TABLA_NOMBRE, args, ID + "=" + id, null);
		
        /* MUST PROPAGATE OUTSIDE UI !
         if (result > 0) {
            WebServiceInterface ws = new WebServiceInterface();
            ws.updActivity(actividad_id, titulo, detalle, fecha, version);
        }*/
        
        return result > 0;
    } // updActivity (in server)
    
    public boolean updActivity(int actividad_id, String titulo, String detalle, String fecha, int version) {
        ContentValues args = new ContentValues();
        
        args.put(ACTIVIDAD_TITULO, titulo);
        args.put(ACTIVIDAD_DETALLE, detalle);
        args.put(ACTIVIDAD_FECHA, fecha);
        args.put(ACTIVIDAD_VERSION, version);
        
        return mDb.update(TABLA_NOMBRE, args, ACTIVIDAD_ID + "=" + actividad_id, null) > 0;
    } // updActivity (in client)
    
    public boolean setActivityId(long id, int actividad_id) {
        ContentValues args = new ContentValues();
        args.put(ACTIVIDAD_ID, actividad_id);

        return mDb.update(TABLA_NOMBRE, args, ID + "=" + id, null) > 0;
    } // setActivityId
    
}

